package condominio.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import condominio.modelo.Reserva;
import condominio.excepcion.DAOExcepcion;
import condominio.util.ConexionBD;

public class ReservaDAO extends BaseDAO {

	public Reserva insertar(Reserva vo) throws DAOExcepcion {
		String query = "INSERT INTO reserva (Residente,EspacioReservado,FechaReserva,Hora,MotivoReserva,Comentario) values (?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getResidente());
			stmt.setInt(2, vo.getEspacioreservado());
			stmt.setDate(3, vo.getFechareserva());
			stmt.setByte(4, vo.getHora());
			stmt.setInt(5, vo.getMotivoreserva());
			stmt.setString(6, vo.getComentario());
			int i = stmt.executeUpdate();
			
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}	

		} catch (SQLException e) {
			//System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public Reserva obtener(int codigoreserva) throws DAOExcepcion {
		Reserva vo = new Reserva();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			//String query = "SELECT CodigoReserva,Residente,EspacioReservado,InicioReserva,FinReserva,MotivoReserva,Comentario,Activacion FROM reserva codigoreserva =?";
			String query = "SELECT CodigoReserva,Residente,NombreCompleto,EspacioReservado,FechaReserva,Hora,MotivoReserva,Comentario,Activacion FROM reserva A INNER JOIN residente B ON A.residente = B.CodigoResidente WHERE CodigoReserva = ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, codigoreserva);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCodigoreserva(rs.getInt("CodigoReserva"));
				vo.setResidente(rs.getString("Residente"));
				vo.setNombrecompleto(rs.getString("NombreCompleto"));
				vo.setEspacioreservado(rs.getByte("EspacioReservado"));
				vo.setFechareserva(rs.getDate("FechaReserva"));
				vo.setHora(rs.getByte("Hora"));
				vo.setMotivoreserva(rs.getByte("MotivoReserva"));
				vo.setComentario(rs.getString("Comentario"));
				vo.setActivacion(rs.getBoolean("Activacion"));
			}
		} catch (SQLException e) {
			//System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public void eliminar(int codigoreserva) throws DAOExcepcion {
		String query = "update reserva set estado = 0 WHERE codigoreserva=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, codigoreserva);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			//System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
		
	public Collection<Reserva> listar(String residente,
									  java.sql.Date inicio,
									  java.sql.Date fin) throws DAOExcepcion {
		Collection<Reserva> c = new ArrayList<Reserva>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT CodigoReserva,Residente,NombreCompleto,EspacioReservado,FechaReserva,Hora,MotivoReserva,Comentario,Activacion,A.Estado FROM reserva A INNER JOIN residente B ON A.residente = B.CodigoResidente where A.Estado = 1 and B.CodigoResidente = ? AND FechaReserva BETWEEN ? AND ? ORDER BY FechaReserva";
			stmt = con.prepareStatement(query);
			stmt.setString(1, residente);
			stmt.setDate(2, inicio);
			stmt.setDate(3, fin);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Reserva vo = new Reserva();
				vo.setCodigoreserva(rs.getInt("CodigoReserva"));
				vo.setResidente(rs.getString("Residente"));
				vo.setNombrecompleto(rs.getString("NombreCompleto"));
				vo.setEspacioreservado(rs.getByte("EspacioReservado"));
				vo.setFechareserva(rs.getDate("FechaReserva"));
				vo.setHora(rs.getByte("Hora"));
				vo.setMotivoreserva(rs.getByte("MotivoReserva"));
				vo.setComentario(rs.getString("Comentario"));
				vo.setActivacion(rs.getBoolean("Activacion"));
				vo.setEstado(rs.getBoolean("Estado"));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public Collection<Reserva> buscarPorFechaHora(byte espacioreservado,
												  java.sql.Date fechareserva,
												  byte hora) throws DAOExcepcion {
Collection<Reserva> c = new ArrayList<Reserva>();
Connection con = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
con = ConexionBD.obtenerConexion();
String query = "SELECT CodigoReserva,Residente,EspacioReservado,FechaReserva,Hora,MotivoReserva,Comentario,Activacion,A.Estado FROM reserva A where A.Estado = 1 and EspacioReservado = ? AND FechaReserva = ? AND Hora = ?";
stmt = con.prepareStatement(query);
stmt.setByte(1, espacioreservado);
stmt.setDate(2, fechareserva);
stmt.setByte(3, hora);
rs = stmt.executeQuery();
while (rs.next()) {
Reserva vo = new Reserva();
vo.setCodigoreserva(rs.getInt("CodigoReserva"));
vo.setResidente(rs.getString("Residente"));
vo.setEspacioreservado(rs.getByte("EspacioReservado"));
vo.setFechareserva(rs.getDate("FechaReserva"));
vo.setHora(rs.getByte("Hora"));
vo.setMotivoreserva(rs.getByte("MotivoReserva"));
vo.setComentario(rs.getString("Comentario"));
vo.setActivacion(rs.getBoolean("Activacion"));
vo.setEstado(rs.getBoolean("Estado"));
c.add(vo);
}

} catch (SQLException e) {
System.err.println(e.getMessage());
throw new DAOExcepcion(e.getMessage());
} finally {
this.cerrarResultSet(rs);
this.cerrarStatement(stmt);
this.cerrarConexion(con);
}
return c;
}
	
}
